Passed
Pull Request — master (#148)
by Mathieu
03:30
created

GetMonthlyFairCalendarQueryHandler   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 67
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 56
dl 0
loc 67
c 0
b 0
f 0
rs 10

3 Functions

Rating   Name   Duplication   Size   Complexity  
A buildLeaves 0 15 2
A execute 0 15 1
A buildEvents 0 22 4
1
import { Inject } from '@nestjs/common';
2
import { QueryHandler } from '@nestjs/cqrs';
3
import { IEventRepository } from 'src/Domain/FairCalendar/Repository/IEventRepository';
4
import { IDateUtils } from 'src/Application/IDateUtils';
5
import { GetFairCalendarOverview } from 'src/Domain/FairCalendar/GetFairCalendarOverview';
6
import { MonthlyEventsView } from '../View/MonthlyEventsView';
7
import { ProjectView } from 'src/Application/Project/View/ProjectView';
8
import { TaskView } from 'src/Application/Task/View/TaskView';
9
import { ILeaveRepository } from 'src/Domain/HumanResource/Leave/Repository/ILeaveRepository';
10
import { FairCalendarView } from '../View/FairCalendarView';
11
import { GetMonthlyFairCalendarQuery } from './GetMonthlyFairCalendarQuery';
12
import { Leave } from 'src/Domain/HumanResource/Leave/Leave.entity';
13
import { Event } from 'src/Domain/FairCalendar/Event.entity';
14
15
@QueryHandler(GetMonthlyFairCalendarQuery)
16
export class GetMonthlyFairCalendarQueryHandler {
17
  constructor(
18
    @Inject('IEventRepository')
19
    private readonly eventRepository: IEventRepository,
20
    @Inject('ILeaveRepository')
21
    private readonly leaveRepository: ILeaveRepository,
22
    @Inject('IDateUtils')
23
    private readonly dateUtils: IDateUtils,
24
    private readonly getFairCalendarOverview: GetFairCalendarOverview
25
  ) {}
26
27
  public async execute(
28
    query: GetMonthlyFairCalendarQuery
29
  ): Promise<MonthlyEventsView> {
30
    const { date, userId } = query;
31
    const formatedDate = this.dateUtils.format(date, 'y-MM-dd');
32
33
    const [ events, leaves ] = await Promise.all([
34
      this.eventRepository.findMonthlyEvents(formatedDate, userId),
35
      this.leaveRepository.findMonthlyLeaves(formatedDate, userId)
36
    ]);
37
38
    return new MonthlyEventsView(
39
      [...this.buildEvents(events), ...this.buildLeaves(leaves)],
40
      this.getFairCalendarOverview.index([...events, ...leaves])
41
    );
42
  }
43
44
  private buildEvents(events: Event[]): FairCalendarView[] {
45
    const result: FairCalendarView[] = [];
46
47
    for (const event of events) {
48
      const project = event.getProject();
49
      const task = event.getTask();
50
51
      result.push(
52
        new FairCalendarView(
53
          event.getType(),
54
          event.getTime() / 100,
55
          event.getDate(),
56
          event.getId(),
57
          event.getSummary(),
58
          project ? new ProjectView(project.getId(), project.getName()) : null,
59
          task ? new TaskView(task.getId(), task.getName()) : null
60
        )
61
      );
62
    }
63
64
    return result;
65
  }
66
67
  private buildLeaves(leaves: Leave[]): FairCalendarView[] {
68
    const result: FairCalendarView[] = [];
69
70
    for (const leave of leaves) {
71
      result.push(
72
        new FairCalendarView(
73
          leave.getType(),
74
          leave.getTime() / 100,
75
          leave.getDate()
76
        )
77
      );
78
    }
79
80
    return result;
81
  }
82
}
83